package Serializadores;

import java.io.File;
import java.io.IOException;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import tp3.Esquina;
import tp3.Juego;
import tp3.Vehiculo;
import tp3.Tablero;

public class SerializarJuego {

	public void serializar(Juego juego, String nombre) {
		
		try {
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

		SerializarTablero serializadorTablero = new SerializarTablero();
		SerializarVehiculo serializadorVehiculo = new SerializarVehiculo();
		//-----------------------------------------------
		
		// Tag principal
		Document doc = docBuilder.newDocument();
		Element raiz = doc.createElement("Juego");
		doc.appendChild(raiz);
		
		String nombreJugador = juego.getVehiculo().getJugador().getNombre();
		
		Element Nombre = doc.createElement("Nombre");
		Nombre.setAttribute("jugador", nombreJugador);
		raiz.appendChild(Nombre);
		
		
		String cadenaNivel = "";
		cadenaNivel = String.valueOf(juego.getNivel());
		
		
		Element Nivel = doc.createElement("Nivel");
		Nivel.setAttribute("nivel", cadenaNivel);
		raiz.appendChild(Nivel);
		
		
		//cuando serializo un tablero que ya pertenece a un juego lo grabo con el formato "T+nombredelJuego.xml"
		Element tablero =  (serializadorTablero.serializar(juego.getTablero(),"T"+nombre));
		doc.adoptNode(tablero); // como tablero esta en otro documento, este metodo adopta a ese nodo de otro documento
	 	raiz.appendChild(tablero);
		
		
	 	Element vehiculo = (serializadorVehiculo.serializar(juego.getVehiculo(), "V"+nombre));
	 	doc.adoptNode(vehiculo);
	 	
	 	
	 	
	 	
	 	List<Esquina> esquinas =juego.getTablero().getEsquinas();
	 	String posicion = String.valueOf(esquinas.indexOf(juego.getVehiculo().getPosicion())); 
	 	vehiculo.setAttribute("posicion", posicion);		
	 	
	 	
	 	raiz.appendChild(vehiculo);
	 	
	 	
	 
	 	
	 	
	 	
	 	
		
		String nombreDelArchivo = nombre +"_juego"+ ".xml";	
		// creo el archivo xml
		TransformerFactory transformerFactory = TransformerFactory.newInstance();
		Transformer transformer = transformerFactory.newTransformer();
		DOMSource source = new DOMSource(doc);
		StreamResult result = new StreamResult(new File(nombreDelArchivo));

		transformer.transform(source, result);
		
		}
		catch (TransformerException tfe) {
		tfe.printStackTrace();
	    }catch (ParserConfigurationException e) {
			
			e.printStackTrace();
		}
		

	 
	
	}
	
	
	
	public Juego deserializar(String nombre) throws ParserConfigurationException, SAXException, IOException {
		
			String archivo = nombre+"_juego"+".xml";
		
			
			Juego juegoSalvado = new Juego();
			//inicializo 
			File stocks = new File(archivo);
			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document doc = dBuilder.parse(stocks);
			doc.getDocumentElement().normalize();
			SerializarTablero serializadorTablero= new SerializarTablero();
			SerializarVehiculo serializadorVehiculo = new SerializarVehiculo();
			
			System.out.println(archivo);
			Tablero nuevoTablero=serializadorTablero.deserializar("T"+nombre);
			juegoSalvado.setTablero(nuevoTablero);
			
			Vehiculo vehiculo = serializadorVehiculo.deserializar("V"+nombre);
		
			juegoSalvado.setVehiculo(vehiculo);
			
			
			
			//Recupero la posicion del vehiculo
			NodeList nodes = doc.getElementsByTagName("Vehiculo");
			Node tagVehiculo = nodes.item(0);
			
			//salvando nombre de jugador
			nodes = doc.getElementsByTagName("Nombre");
			Node tagNombre = nodes.item(0);
			String nombreJugador=((Element) tagNombre).getAttribute("jugador");
			
			//salvando Nivel
			nodes = doc.getElementsByTagName("Nivel");
			Node tagNivel = nodes.item(0);
			
			int nivel = Integer.parseInt(( (Element) tagNivel).getAttribute("nivel"));
			
			juegoSalvado.setNivel(nivel);
			
			
			int posicion = Integer.parseInt( ((Element) tagVehiculo).getAttribute("posicion"));
			
			juegoSalvado.getVehiculo().setPosicion(nuevoTablero.getEsquinas().get(posicion));
			juegoSalvado.getVehiculo().getJugador().setNombre(nombreJugador);
			
			
			
			
			//------------------------------------------
			
		
			 return juegoSalvado;
			 
			
	
		
	}
	
	
	

}
